import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Genera un automovil para el jugador principal del juego.
 * 
 * @author Asael Hernández García 
 * @version (a version number or a date)
 */
public class Jugador extends Automovil
{
    private int velocidad;
    private int tiempo;
    private int pixels;
    private int limitXi, limitXf;
    private int limitYi, limitYf;
    private int dist;
    private SimpleTimer timerDist, timerGas, tiempoTecla;
    private GreenfootImage jugador;
    private GreenfootSound claxonSound;
  
    /**
     * @int distancia recibe la distancia que tiene que avanzar para cambiar de nivel
     */
    public Jugador(int distancia)
    {
        velocidad = 1;
        dist = distancia;
        pixels = 1;
        tiempo = 1000;
        limitXi =250;
        limitXf = 620; 
        timerDist = new SimpleTimer();
        timerDist.mark();
        timerGas = new SimpleTimer();
        timerGas.mark();
        tiempoTecla = new SimpleTimer();
        tiempoTecla.mark();
        jugador = new GreenfootImage("Jugador.png");
        claxonSound = new GreenfootSound("claxon.mp3");
        claxonSound.setVolume(80);
    }
    
    public void act() 
    {
        checkKeys();
        setImage("Jugador.png");
        
        if(timerDist.millisElapsed() > tiempo){
            ((PistaAutomovil)getWorld()).addDist(1); 
            timerDist.mark();
        }
        if(timerGas.millisElapsed() > tiempo - 30){
            ((PistaAutomovil)getWorld()).subGas(); 
            timerGas.mark();
        }    
        
        if(getY() == getWorld().getHeight()/2)
            setImage("Jugador.png");
        if(getY() < getWorld().getHeight()/2 + 30)
            setImage("Jugador_reducido.png");
        if(getY() >= getWorld().getHeight()/2 + 100)
            setImage("Jugador_aumentado.png");
        
    }
    
    /** Método para revisar teclas que presiona el jugador
     * Permite realizar el movimiento
     */
    public void checkKeys()
    {
        if(Greenfoot.isKeyDown("right") && getX() < limitXf ){
            setLocation(getX()+3, getY());
            limitYi += 4;
            limitYf -= 4;
        }
        if(Greenfoot.isKeyDown("left") && getX() > limitXi ){
            setLocation(getX()-3,getY());
            limitYi += 4;
            limitYf -= 4;
        }
        if(Greenfoot.isKeyDown("up") && getY() >= getWorld().getHeight()/2){
            setLocation(getX(), getY()-3);
            limitXi += 4;
            limitXf -= 4;
        }
        if(Greenfoot.isKeyDown("down") && getY() <= getWorld().getHeight()- getImage().getHeight()/2){
            setLocation(getX(), getY()+3);
            limitXi -= 4;
            limitXf += 4;
        }
        if(Greenfoot.isKeyDown("space"))
            claxon();
        if(Greenfoot.isKeyDown("shift") && velocidad <5 && tiempoTecla.millisElapsed() > 1000){
            ((PistaAutomovil)getWorld()).addVel();
            tiempo -=150;
            velocidad++;
            tiempoTecla.mark();
        }
        
        if(Greenfoot.isKeyDown("control") && velocidad >1 && tiempoTecla.millisElapsed() > 1000){
            ((PistaAutomovil)getWorld()).subVel();
            tiempo +=150;
            velocidad--;
            tiempoTecla.mark();
        }
        }
        
    /** Método para saber si el jugador se impacto contra otro automovil
     * @return true o false dependiendo si el jugador se impacto con algun obstaculo
     */
    public boolean impacto()
    {
      if( isTouching(Obstaculo.class) || isTouching(Patrulla.class) || isTouching(Civil.class) || isTouching(Animal.class))
       return true;
      else 
       return false;
    }
    
    /**Método para utilizar el claxon del automovil
     * 
     */
    public void claxon()
    {
        if(claxonSound.isPlaying() != true)
            claxonSound.play();
        if(getWorld().getObjects(Civil.class).isEmpty() == false)
            ((PistaAutomovil)getWorld()).advertencia(true);
        if(getWorld().getObjects(Camello.class).isEmpty() == false)
            ((PistaAutomovil)getWorld()).advertencia(true);
        if(getWorld().getObjects(Leon.class).isEmpty() == false)
            ((PistaAutomovil)getWorld()).advertencia(true);
    }
    
}
